import { Entity, Column, ManyToMany, Index } from 'typeorm';
import { BaseEntity } from '../common/base/base.entity';
import { Role } from './role.entity';

/**
 * 权限实体
 * 对应数据库中的 permissions 表
 *
 * 权限命名规范：资源:操作
 * 例如：product:create, user:delete, order:manage
 */
@Entity('permissions')
@Index('idx_permission_name', ['name']) // 为权限名称创建索引
@Index('idx_permission_resource', ['resource']) // 为资源创建索引
export class Permission extends BaseEntity {
  /**
   * 权限名称（唯一）
   * 格式：资源:操作
   * 例如：product:create, user:delete
   */
  @Column({
    type: 'varchar',
    length: 100,
    unique: true,
    comment: '权限名称（唯一标识，格式：资源:操作）',
  })
  name: string;

  /**
   * 权限显示名称
   * 例如：创建商品、删除用户
   */
  @Column({
    type: 'varchar',
    length: 100,
    comment: '权限显示名称',
  })
  displayName: string;

  /**
   * 权限描述
   */
  @Column({
    type: 'text',
    nullable: true,
    comment: '权限描述',
  })
  description?: string;

  /**
   * 资源类型
   * 例如：product, user, order
   */
  @Column({
    type: 'varchar',
    length: 50,
    comment: '资源类型（如：product, user, order）',
  })
  resource: string;

  /**
   * 操作类型
   * 例如：create, read, update, delete, manage
   */
  @Column({
    type: 'varchar',
    length: 50,
    comment: '操作类型（如：create, read, update, delete）',
  })
  action: string;

  /**
   * 拥有该权限的角色（多对多关系）
   *
   * @ManyToMany 装饰器说明：
   * - 一个权限可以被多个角色拥有
   * - 一个角色可以有多个权限
   *
   * 注意：
   * - 这是关系的被控方
   * - 不需要定义 @JoinTable（已在 Role 实体中定义）
   */
  @ManyToMany(() => Role, (role) => role.permissions)
  roles: Role[];
}
